import os
import shutil
# 比较两个A，B两个文件夹，并将A文件夹中文件名（不含扩展名）与B文件夹中不同的文件拷贝到C文件夹中

def get_filenames_without_extension(directory):
    """获取指定目录下所有文件的文件名（不含扩展名）。"""
    filenames = set()
    for root, _, files in os.walk(directory):
        for file in files:
            name, _ = os.path.splitext(file)
            filenames.add(name)
    return filenames

def copy_unique_files_from_a_to_c(dir_a, dir_b, dir_c):
    # 创建目标目录C，如果它不存在的话
    if not os.path.exists(dir_c):
        os.makedirs(dir_c)

    # 获取文件夹A和B中文件名（不含扩展名）
    files_in_a = get_filenames_without_extension(dir_a)
    files_in_b = get_filenames_without_extension(dir_b)

    # 找出在A中但不在B中的文件名
    unique_files_in_a = files_in_a - files_in_b

    # 将这些唯一的文件从A复制到C
    copied_files_count = 0
    for root, _, files in os.walk(dir_a):
        for file in files:
            name, ext = os.path.splitext(file)
            if name in unique_files_in_a:
                src_file_path = os.path.join(root, file)
                dest_file_path = os.path.join(dir_c, file)
                
                # 如果目标位置已经有同名文件，则重命名
                counter = 1
                while os.path.exists(dest_file_path):
                    new_file_name = f"{name}-{counter}{ext}"
                    dest_file_path = os.path.join(dir_c, new_file_name)
                    counter += 1
                
                shutil.copy2(src_file_path, dest_file_path)  # 使用copy2以保留元数据
                print(f"Copied: {src_file_path} -> {dest_file_path}")
                copied_files_count += 1

    print(f"Total number of files copied from A to C: {copied_files_count}")

# 示例用法
dir_a =  r'D:\北京伊吕科技\应用场景\数据标注\深启科技\护栏数据集\images(异常护栏)'  # 替换为实际的A文件夹路径
dir_b =  r'D:\北京伊吕科技\应用场景\数据标注\深启科技\护栏数据集\labes(异常护栏)'  # 替换为实际的B文件夹路径
dir_c = r'D:\333333'      # 注意这里使用原始字符串（r''）避免转义字符问题

copy_unique_files_from_a_to_c(dir_a, dir_b, dir_c)